﻿using System.Text;

namespace Sage.MarkdownRenderer.Html
{
    /// <summary>
    /// HTML 模板构建器
    /// </summary>
    public class HtmlTemplateBuilder
    {
        /// <summary>
        /// 创建 HTML 模板
        /// </summary>
        /// <param name="config">模板配置</param>
        /// <returns>完整的 HTML 字符串</returns>
        public static string CreateTemplate(HtmlTemplateConfig config)
        {
            var html = new StringBuilder();

            // 构建 HTML 头部
            html.AppendLine(BuildHtmlHead(config));

            // 构建样式
            html.AppendLine("<style>");
            html.AppendLine(BuildStyles(config));
            html.AppendLine("</style>");

            html.AppendLine("</head>");

            // 构建 Body
            html.AppendLine(BuildHtmlBody(config));

            // 构建脚本
            html.AppendLine(BuildScripts(config));

            html.AppendLine("</body>");
            html.AppendLine("</html>");

            return html.ToString();
        }

        /// <summary>
        /// 构建 HTML 头部
        /// </summary>
        private static string BuildHtmlHead(HtmlTemplateConfig config)
        {
            return $@"<!DOCTYPE html>
            <html lang='zh-CN'>
            <head>
                <meta charset='utf-8'>
                <meta name='viewport' content='width=device-width, initial-scale=1.0'>
                <meta name='color-scheme' content='{GetColorScheme(config.Theme)}'>
                <title>{config.Title}</title>";
        }

        /// <summary>
        /// 构建样式
        /// </summary>
        private static string BuildStyles(HtmlTemplateConfig config)
        {
            var styles = new StringBuilder();

            // 计算样式变量
            var maxWidthStyle = config.MaxWidth > 0 ? $"max-width: {config.MaxWidth}px; margin: 0 auto;" : "";
            var scrollbarStyle = config.ShowScrollbar ? "" : "overflow: hidden;";

            // 基础样式
            styles.AppendLine(HtmlStyleProvider.GetBaseStyles());

            // Body 样式
            styles.AppendLine($@"
            body {{ 
                font-family: {config.FontFamily}; 
                font-size: {config.FontSize}px;
                line-height: 1.6;
                margin: 0;
                padding: 20px;
                user-select: none; 
                -webkit-user-select: none; 
                -moz-user-select: none; 
                -ms-user-select: none;
                word-wrap: break-word;
                min-height: 100vh;
                {maxWidthStyle}
                {scrollbarStyle}
            }}");

            // 主题样式
            styles.AppendLine(HtmlStyleProvider.GetThemeStyles(config.Theme));

            // Markdown 样式
            styles.AppendLine(HtmlStyleProvider.GetMarkdownStyles());

            // 代码样式
            styles.AppendLine(HtmlStyleProvider.GetCodeStyles(config.EnableCodeCopy));

            // 组件样式
            styles.AppendLine(HtmlStyleProvider.GetComponentStyles());

            // 响应式样式
            if (config.EnableResponsive)
            {
                styles.AppendLine(HtmlStyleProvider.GetResponsiveStyles());
            }

            // 打印样式
            if (config.EnablePrintStyles)
            {
                styles.AppendLine(HtmlStyleProvider.GetPrintStyles());
            }

            // 动画样式
            if (config.EnableAnimation)
            {
                styles.AppendLine(HtmlStyleProvider.GetAnimationStyles(config.EnableHoverAnimations));
            }

            // 自定义样式
            if (!string.IsNullOrEmpty(config.CustomCss))
            {
                styles.AppendLine("/* 自定义样式 */");
                styles.AppendLine(config.CustomCss);
            }

            // 主题样式
            styles.AppendLine(HtmlStyleProvider.GetThemeStyles(config.Theme));
            // 自定义颜色配置
            if (config.ColorConfig != null)
            {
                styles.AppendLine("/* 自定义颜色配置 */");
                styles.AppendLine(config.ColorConfig.GenerateCustomCssVariables());
            }

            return styles.ToString();
        }

        /// <summary>
        /// 构建 HTML Body
        /// </summary>
        private static string BuildHtmlBody(HtmlTemplateConfig config)
        {
            var bodyClass = config.EnableAnimation ? "fade-in" : "";
            var bodyContent = FormatBodyContent(config);

            return $@"<body data-theme='{config.Theme.ToString().ToLower()}' class='{bodyClass}'>
    {bodyContent}";
        }

        /// <summary>
        /// 构建脚本
        /// </summary>
        private static string BuildScripts(HtmlTemplateConfig config)
        {
            var scripts = new StringBuilder();

            if (config.EnableCodeCopy)
            {
                scripts.AppendLine(HtmlScriptProvider.GetCodeCopyScript());
            }

            if (config.EnableAnimation)
            {
                scripts.AppendLine(HtmlScriptProvider.GetAnimationScript(true));
            }

            return scripts.ToString();
        }

        /// <summary>
        /// 格式化页面内容
        /// </summary>
        private static string FormatBodyContent(HtmlTemplateConfig config)
        {
            if (config.ShowWelcomeLayout && !string.IsNullOrEmpty(config.Title))
            {
                return $@"
                <div class='welcome-container'>
                    <h1>{config.Title}</h1>
                    {config.Content}
                </div>";
            }
            else if (config.ShowWelcomeLayout)
            {
                return $@"
                <div class='welcome-container'>
                    {config.Content}
                </div>";
            }
            else
            {
                return config.Content;
            }
        }

        /// <summary>
        /// 获取颜色方案
        /// </summary>
        private static string GetColorScheme(ThemeMode theme)
        {
            return theme switch
            {
                ThemeMode.Dark => "dark",
                ThemeMode.Auto => "light dark",
                _ => "light"
            };
        }
    }
}
